<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      //逻辑非！
      console.log(!123); //flase
      console.log(!0); //true
      console.log(!"abc"); //false  非空字符串为true
      console.log(!""); //true
      //对象或数组不管有没有值，都转换为true
      console.log(!{}); //flase
      console.log(![]); //flase
      console.log(!{ key: "abc" }); //flase
      console.log(![1, 2, 3]); //flase
      if (234) {
      } //234为true  条件成立

      //逻辑&&
      console.log(true && false); //false
      //当两个操作数中有一个数是非逻辑值时，当第一个操作数为true时，返回第二个操作数的值；
      //当第一个操作数为false时返回第一个操作数的值
      console.log(123 && 0); //0
      console.log(123 && 10 + 20); //30
      console.log(123 && "abc"); //abc
      console.log(false && []); //flase
      console.log(0 && "aaa"); //0

      //逻辑||
      console.log(true || false); //true
      //如果两个中任意一个操作数非逻辑值（true/false），第一个操作数的结果为true时，返回第一个操作数的值；
      //第一个操作数结果为false时，返回第二个操作数的值。
      console.log(123 || 0); //123
      console.log(123 || 10 + 20); //123
      console.log(123 || "abc"); //123
      console.log(false || []); //[]
      console.log(0 || "aaa"); //aaa

      //短路运算:
      //a.&&运算时，如果第一个操作数为flase时，不需要计算第二个操作数，结果返回flase。
      //b.||运算时，如果第一个操作数为true时，不需要计算第二个操作数，结果返回true。
      var x = 100;
      var y = true && ++x;//存在其中一个数为非逻辑值，第一个数为true返回第二个数的值
      console.log(y);
      var y = false && ++x; //++x被短路
      var y = false || ++x;
      console.log(y);
      //var y = true || ++x;//++x被短路
      console.log(x, y);
    </script>
  </body>
</html>
